package ui.tree
{
	
	import common.util.TreeUtil;
	
	import mx.collections.ArrayCollection;
	import mx.core.ClassFactory;
	import mx.events.ListEvent;
	
	import ui.tree.renderer.checkbox.TreeCheckBoxOnlyCheckSelfRenderer;
	import ui.tree.renderer.checkbox.TreeCheckBoxParentRenderer;
	import ui.tree.renderer.checkbox.TreeCheckBoxRenderer;
	import ui.tree.renderer.line.TreeItemLinesRenderer;

	/**
	 * 基本树类型，默认为线状树，可以改变为checkbox树
	 */ 
	public class BaseTree extends AutoSizeTree
	{
		//接收两个参数，第一个是选中或取消选中的 数据对象数组， 第二个是 checked:true/false
		public var checkBoxChangeHandler:Function;
		
		/**
		 * 展开与收缩图片
		 */ 
		[Embed(source="resources/image/tree/plus.png")]
		private var PLUS:Class;
		[Embed(source="resources/image/tree/minus.png")]
		private var MINUS:Class; 
		
		/**
		 * checkbox树特有的，对应节点模型的勾选属性
		 */
		public var checkField:String = "checked";
		
		[Inspectable(defaultValue = "line", enumeration = "line,checkbox,checkboxonlycheckself", category = "String")]
		/**
		 * 树的默认渲染类型是线型,line表示线状树,checkbox表示复选框树
		 */
		public var treeRenderType:String = "line";
		
		
		/**
		 * 构造（展开时的图标，以及间距）
		 */ 
		public function BaseTree()
		{
			super();
			this.setStyle("disclosureOpenIcon",MINUS);
			this.setStyle("disclosureClosedIcon",PLUS);
			this.setStyle("paddingLeft",5);
		}
		
		/**
		 * 预处理树状态
		 */ 
		override public function initialize():void
		{
			super.initialize();
			setTreeTypeByCondtion();
		}
		
		public function resetDataProvider():void{
			
		}
		
		/**
		 * 根据条件获取设置树类型
		 */ 
		private function setTreeTypeByCondtion():void{
			var this_:BaseTree = this;
			
			if(treeRenderType=="checkbox"){//复选框型
				this.rendererIsEditor = true;
				this.allowMultipleSelection=false ;
				this.allowDragSelection=false;
				this.itemRenderer = new ClassFactory(TreeCheckBoxRenderer);

				this.addEventListener(ListEvent.ITEM_CLICK,function(event:ListEvent):void{
					var renderer:TreeCheckBoxRenderer = event.itemRenderer as TreeCheckBoxRenderer;
					renderer.onItemClick(this_.selectedItem[checkField]=='1' ? 0 : 1);
				});
			}else if(treeRenderType=="checkboxonlycheckself"){
				this.rendererIsEditor = true;
				this.allowMultipleSelection=false ;
				this.allowDragSelection=false;
				this.itemRenderer = new ClassFactory(TreeCheckBoxOnlyCheckSelfRenderer);
				
				this.addEventListener(ListEvent.ITEM_CLICK,function(event:ListEvent):void{
					var renderer:TreeCheckBoxOnlyCheckSelfRenderer = event.itemRenderer as TreeCheckBoxOnlyCheckSelfRenderer;
					renderer.onItemClick(this_.selectedItem[checkField]=='1' ? 0 : 1);
				});
			}else{//线型
				treeRenderType = "line";
				this.itemRenderer = new ClassFactory(TreeItemLinesRenderer);
			}
		}
		
		/**
		 * 展开所有节点
		 */ 
		public function expandAll():void{
			validateNow();
			var ac:ArrayCollection = dataProvider as ArrayCollection;
			if(ac){
				var ar:Array = ac.toArray();
				for each(var item:Object in ar){
					expandChildrenOf(item,true);
				}
			}
		}
		
		/**
		 * 收缩所有节点
		 */ 
		public function collapseAll():void{
			validateNow();
//			openItems = [];//全部收起
			var ac:ArrayCollection = dataProvider as ArrayCollection;
			if(ac){
				var ar:Array = ac.toArray();
				for each(var item:Object in ar){
					expandChildrenOf(item,false);
				}
			}
		} 
		
		/**
		 *展开某节点自动递归展开其父节点
		 */
		public function expandParents(item:Object):void {
			try{
				if (item != null) {
//					if(!isItemOpen(item)){
						if(item.hasOwnProperty('parent')){
							expandParents(item['parent']);  
						}
						expandItem(item, true);
//					}
				}
			}catch(err:Error){
				trace(err);
			}
		}
		
		/**
		 *展开多个节点极其父节点
		 */
		public function expandMultiParents(array:ArrayCollection):void {
			try{
				for each(var obj:Object in array){
					expandItem(obj.parent,true);
				}
			}catch(err:Error){
				trace(err);
			}
		}
//		
//		/**
//		 * 选中所有查询到的节点
//		 * 
//		 * @param searchStr 检索的字符串
//		 * @param selectNode 是否选中节点 默认不选中节点（选中节点模式则resultMaxNum有效，不选中节点模式resultMaxNum无效）
//		 * @param resultMaxNum 最大结果数 默认最多选中20个
//		 */ 
//		public function selectAllBySearchStr(searchStr:String,selectNode:Boolean=false,resultMaxNum:int=20,isPrecise:Boolean=false):Array {
//			collapseAll();
//			var text:String=searchStr;
//			var items:Array=[];
//			if(text.length>0) {
//				var list:Array=[];
//				if(dataProvider){
//					var ac:ArrayCollection=dataProvider as ArrayCollection;	
//					for each(var obj:Object in ac){
//						list.push(obj);
//					}
//					searchItems(list,text,items,selectNode,resultMaxNum,isPrecise);
//					if(selectNode){
//						selectedItems=items;
//					}
//				}
//			}
//			if(selectNode && (items.length>=1)){
//				scrollToIndex(selectedIndex);
//			}
//			return items;
//		}
//		
//		/**
//		 * 递归查询匹配的节点
//		 * @childArr 查询的目标树子节点集合
//		 * @find 检索的字符串
//		 * @items 保存查询到的结果
//		 * @param selectNode 是否选中节点（选中节点模式则resultMaxNum有效，不选中节点模式resultMaxNum无效）
//		 * @resultMaxNum 最大结果数
//		 */
//		private function searchItems(childArr:Array,find:String,items:Array,selectNode:Boolean,resultMaxNum:int,isPrecise:Boolean=false):void {
//			if(childArr){
//				for(var i:int=0;i<childArr.length;i++) {
//					var object:Object=childArr[i];
//					var label:String=itemToLabel(object);
//					
//					if(label){
//						if((isPrecise==true && label==find) || (isPrecise==false && label.indexOf(find)>=0)){
//							if(items.length>=resultMaxNum){
//								return;
//							}
//							items.push(object);
//							if(selectNode){//选中节点模式时，最多只检索多少个结果
//								expandParents(object);
//							}
//						}
//					}
//					
//					if(object.hasOwnProperty('children') && object['children']){
//						var ac : ArrayCollection = object['children'] as ArrayCollection;
//						var ar : Array = ac.toArray();
//						searchItems(ar,find,items,selectNode,resultMaxNum,isPrecise);
//					}
//				}
//			}
//		}
//		
		
		/**
		 * 设置复选框树中需要勾选的节点 默认为全部不选中
		 * checkedFlag 是否选中状态
		 */
		public function setAllCheckboxStatus(checkedFlag:Boolean=false):void{
			if(treeRenderType=="checkbox" || treeRenderType=="checkboxonlycheckself"){//复选框型
				var allArr:ArrayCollection = dataProvider as ArrayCollection;
				if(allArr){
					var length:int = allArr.length;
					for(var i:int = 0; i < length; i++){
						setObjCheckState(allArr[i],checkedFlag);
					}
				}
			}
		}
		// --递归获取选中的节点
		private static function setObjCheckState(obj:Object,checkedFlag:Boolean):void{
			if(obj.hasOwnProperty("checked")){
				obj["checked"] = checkedFlag?'1':'0';
			}
			if(obj.hasOwnProperty("children")){
				var child:ArrayCollection= obj.children;
				if(child){
					var lenth:int =	child.length;
					for(var i:int = 0; i < lenth; i++){
						setObjCheckState(child[i],checkedFlag);
					}
				}
			}
		}	

	}
}